import functools

from django.db.models import F
from django.http import JsonResponse
from django.views import View
from django.core.paginator import Paginator
from django.shortcuts import render
# 按照插入顺序排列的字典
from collections import OrderedDict
from apps.goods.models import GoodsChannel, GoodVisitCount
from apps.contents.models import ContentCategory
from utils.goods import get_categories, get_breadcrumb, get_goods_specs
from apps.goods.models import GoodsCategory, SKU
from haystack.query import SearchQuerySet


# 上传图片到fastdfs分布式文件管理系统中
# from fdfs_client.client import Fdfs_client
# # 1.创建客户端qqui
#
#
# client = Fdfs_client(r'/home/zry/Documents/meiduo_marrket/meiduo_mall/utils/fastdfs/client.conf')
#
# # 上传图片
# # 获取file_id, upload_by_filename 上传成功会返回字典数据
# data = client.upload_by_filename('/home/zry/Pictures/B2B.png')
# print(data)
#


class IndexView(View):
    """
    首页的数据分为2部分
    1部分是 商品分类数据
    2部分是 广告数据
    """

    def get(self, request):
        # 1.商品分类数据
        categories = get_categories()

        # 2.广告数据
        contents = {}
        contents_categories = ContentCategory.objects.all()
        for cat in contents_categories:
            contents[cat.key] = cat.content_set.filter(status=True).order_by('sequence')

        # 我们的首页 页面静态化 定时任务
        # 我们把数据传递给模板
        context = {
            'categories': categories,
            'content': contents,
        }

        return render(request, 'index.html', context)


# 分类展示
class ListView(View):
    """商品列表页"""

    def get(self, request, category_id):
        """提供商品列表页"""
        # 获取参数:
        page = request.GET.get('page')
        page_size = request.GET.get('page_size')
        ordering = request.GET.get('ordering')

        # 判断category_id是否正确
        try:
            # 获取三级菜单分类信息:
            category = GoodsCategory.objects.get(id=category_id)
        except Exception as e:
            return JsonResponse({'code': 400,
                                 'errmsg': '获取mysql数据出错'})

        # 查询面包屑导航(函数在下面写着)
        breadcrumb = get_breadcrumb(category)

        # 排序方式:
        try:
            skus = SKU.objects.filter(category=category,
                                      is_launched=True).order_by(ordering)
        except Exception as e:
            return JsonResponse({'code': 400,
                                 'errmsg': '获取mysql数据出错'})

        paginator = Paginator(skus, page_size)
        # 获取每页商品数据
        try:
            page_skus = paginator.page(page)
        except EmptyPage:
            # 如果page_num不正确，默认给用户400
            return JsonResponse({'code': 400,
                                 'errmsg': 'page数据出错'})
        # 获取列表页总页数
        total_page = paginator.num_pages

        # 定义列表:
        list = []
        # 整理格式:
        for sku in page_skus:
            list.append({
                'id': sku.id,
                'default_image_url': sku.default_image.url,
                'name': sku.name,
                'price': sku.price
            })

        # 把数据变为 json 发送给前端
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'breadcrumb': breadcrumb,
            'list': list,
            'count': total_page
        })


class HotView(View):

    def get(self, request, category_id):
        # 判断category_id是否正确
        try:
            # 获取三级菜单分类信息:
            category = GoodsCategory.objects.get(id=category_id)
        except Exception as e:
            return JsonResponse({'code': 400,
                                 'errmsg': '获取mysql数据出错'})
        # 排序方式:
        try:
            skus = SKU.objects.filter(category=category,
                                      is_launched=True).order_by("-sales")
        except Exception as e:
            return JsonResponse({'code': 400,
                                 'errmsg': '获取mysql数据出错'})
        list = []

        for i in range(len(skus)):
            if i >= 2:
                break
            list.append({
                'id': skus[i].id,
                'default_image_url': skus[i].default_image.url,
                'url': skus[i].default_image.url,
                'name': skus[i].name,
                'price': skus[i].price
            })
        # 把数据变为 json 发送给前端
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'hot_skus': list,
        })


class SearchView(View):
    def get(self, request):
        # page是第几页， page_size一页几个数据， q是查询字符串
        page = request.GET.get('page')
        page_size = request.GET.get('page_size')
        q = request.GET.get('q')
        if not all([page, page_size, q]):
            return JsonResponse({'code': 0, "errmsg": "参数不全"})
        # 执行搜索
        sku = SearchQuerySet().filter(content=q)
        # 分页
        paginator = Paginator(sku, page_size)
        # 获取每页商品数据
        try:
            page_skus = paginator.page(page)
        except EmptyPage:
            # 如果page_num不正确，默认给用户400
            return JsonResponse({'code': 400,
                                 'errmsg': 'page数据出错'})
        # 获取列表页总页数
        total_page = paginator.num_pages

        # 将搜索结果转换为字典列表
        sku_list = []
        for result in page_skus:  # 限制结果数量（可选）
            sku_list.append({
                'id': result.object.id,
                'name': result.object.name,
                'price': result.object.price,
                'default_image_url': result.object.default_image.url,
                'searchkey': q,
                'page_size': page_size,
                'count': total_page
            }
            )
        return JsonResponse(sku_list, safe=False)


class DetailView(View):
    """
    需要查询四个数据：

        1. 分类数据
        2. 面包屑
        3. SKU信息
        4. 规格信息

        我们的详情页面也是需要静态华实现的
        但是我们在静态化前，应该可以先把详情界页面的数据展示出来
    """

    def get(self, request, sku_id):

        try:
            # SKU信息
            sku = SKU.objects.get(id=sku_id)
        except SKU.DoesNotExist:
            pass

        # 分类数据
        categories = get_categories()
        # 面包屑
        breadcrumb = get_breadcrumb(sku.category)
        # 规格信息
        good_specs = get_goods_specs(sku)
        context = {
            'categories': categories,
            'breadcrumb': breadcrumb,
            'sku': sku,
            'specs': good_specs,
        }
        return render(request, "detail.html", context)


"""
请求： 接受请求， 获取参数
业务逻辑： 查询有没有，有的话更新数据，没有就新建数据
响应： 返回JSON
步骤：
    1. 接受分类id
    2. 验证参数(验证分类id)
    3. 查询当天 这个分类记录有没有
    4. 有的话更新数据
    5. 没有的话新建数据
    6. 返回响应
"""


class CategoryVisitCountView(View):
    def post(self, request, category_id):
        # 1. 接受分类id
        # 2. 验证参数(验证分类id)
        try:
            category = GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist as e:
            return JsonResponse({'code': 400, 'errmsg': '没有此分类'})
        import datetime
        # 3.查询当天这个分类记录有没有
        # 4.有的话更新数据
        # 5.没有的话新建数据
        record = GoodVisitCount.objects.filter(category=category, data=datetime.datetime.today())
        if len(record) == 0:
            GoodVisitCount.objects.create(category=category, data=datetime.datetime.today(), count=1)
        else:
            record.update(count=F('count') + 1)
        # 6.返回响应
        return JsonResponse({'code': 0, 'errmsg': 'ok'})
